<?php
/*
 * @Author: SunnyJ
 * @Date: 2021-05-03 14:17:14
 * @LastEditors: SunnyJ
 * @LastEditTime: 2021-05-21 19:14:12
 */

namespace app\api\controller;
use think\Db;

class Auth2 extends Base2
{
	// 云采购平台信息常量在此修改
	const PLATFORM_CODE = 'ZF00004'; // 齐鲁云采平台号
	const USERNAME = 'jnjkmall'; // 云采购平台API用户名
	const PASSWORD = '2260800q'; // 云采购平台API密码

	/*
	 * @description: 授权获取Access Token
	 * @param { 当前调用时间，格式为"2014-01-01 01:01:01” } $timestamp 
	 * @param { 用户名 } $username
	 * @param { 密码 } $password
	 * @param { 签名规则：username+password+timestamp+password 将上面字符串MD5加密后转为小写 } $sign
	 * @return { token与过期时间 } array(access_token, expires_at)
	 */
	public function access_token($timestamp,$username,$password,$sign)
	{
		// 1. 验证账号与密码是否一致
		if ($username != Auth2::USERNAME or $password != Auth2::PASSWORD) {
			return $this -> create('', 'access deny: incorrect username or password', false);
		}
		// 2. 验证签名
		$check_sign = md5($username . $password . $timestamp . $password);
		if (strcmp($sign,$check_sign) != 0) {
			return $this->create('', 'access deny: incorrect sign', false);
		}
		// 3. 生成token
		$result = self::generate_token($sign);
		// 4. 返回	
		return $this -> create($result, 'access token success');
	}

 	// 生成token
	private function generate_token($sign) {
		// 获取当前时间
		$timeNow = time();
		// api_token = md5('控制器名' + '方法名' + '时间戳' + '签名')
		$api_token = md5('Auth2' . 'generate_token' . $timeNow . $sign);
		// 将当前时间+12小时作为过期时间
		$expiresDate = date("Y-m-d H:i:s", strtotime("+12hour",$timeNow));
		$arr = array( 'access_token' => $api_token, 'expires_at' => $expiresDate);
		// 将api_token与过期时间保存在数据库中，用于校验
		$data = ['access_token' => $api_token, 'expires_time' => strtotime("+12hour",$timeNow)];
		Db::name('token') -> insert($data);
		// 返回返回access_token + expires_at(12小时)
		return $arr;
	}

	// 验证token与platformCode
	static public function check_token($token,$platformCode) {
		if (empty($token)) {
			// 测试用例
			return ['result'=>true];
		}
		$expires_time = DB::name('token') -> where('access_token',$token) -> value('expires_time');
		if (empty($expires_time)) {
			Db::name('token') -> where('expires_time', '<', time()) -> delete();
			// token 不存在
			return ['result'=>false, 'msg'=>'token_expired or does not exist'];
		}
		if ($expires_time < time()) {
			// 清除过期token
			Db::name('token') -> where('expires_time', '<', time()) -> delete();
			// token 已失效
			return ['result'=>false, 'msg'=>'token_expired'];
		}
		if ($platformCode != Auth2::PLATFORM_CODE) {
			// platformCode不正确
			return ['result'=>false, 'msg'=>'undefined platform code'];
		}
		// token延期
		Db::name('token') -> where('access_token',$token) -> update(['expires_time' => strtotime("+12hour",time())]);
		return ['result'=>true];
	}

}
?>
